"""
内置提示词模板定义模块

提供各种场景的预定义提示词模板。
"""

from typing import Dict, List

from .types import PromptTemplate, PromptStyle, PromptCategory


class BuiltinTemplates:
    """内置提示词模板集合"""

    @staticmethod
    def get_rag_templates() -> Dict[str, PromptTemplate]:
        """获取RAG相关模板"""
        return {
            # 标准RAG模板
            "rag_standard": PromptTemplate(
                name="rag_standard",
                template="""基于以下提供的上下文信息，请准确回答用户的问题。

【上下文信息】
{context}

【用户问题】
{question}

【回答要求】
1. 请严格基于上下文信息回答问题
2. 如果上下文中没有相关信息，请明确说明
3. 回答要准确、清晰、有条理
4. 可以适当引用上下文中的具体内容

【回答】""",
                description="标准RAG问答模板，适合大多数场景",
                style=PromptStyle.FORMAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.RAG,
                    "complexity": "medium",
                    "best_for": "general_qa"
                }
            ),

            # 简洁RAG模板
            "rag_concise": PromptTemplate(
                name="rag_concise",
                template="""根据上下文回答问题：

上下文：{context}

问题：{question}

回答：""",
                description="简洁RAG问答模板，适合快速问答",
                style=PromptStyle.CONCISE,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.RAG,
                    "complexity": "low",
                    "best_for": "quick_response"
                }
            ),

            # 详细RAG模板
            "rag_detailed": PromptTemplate(
                name="rag_detailed",
                template="""请基于提供的上下文信息，对用户问题进行详细而全面的回答。

【详细上下文】
{context}

【用户问题】
{question}

【详细分析要求】
1. 深入分析上下文中的相关信息
2. 提供结构化的回答
3. 引用具体的上下文内容作为支撑
4. 如有必要，指出信息的局限性
5. 提供相关的背景信息或扩展知识

【详细回答】""",
                description="详细RAG问答模板，适合深度分析",
                style=PromptStyle.DETAILED,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.RAG,
                    "complexity": "high",
                    "best_for": "comprehensive_analysis"
                }
            ),

            # 学术RAG模板
            "rag_academic": PromptTemplate(
                name="rag_academic",
                template="""请基于提供的学术资料，以严谨的学术态度回答用户问题。

【学术资料】
{context}

【研究问题】
{question}

【学术回答要求】
1. 采用严谨的学术语言和逻辑
2. 明确区分事实引用和推断分析
3. 提供论证过程和证据支持
4. 指出研究的局限性和假设前提
5. 如涉及不同观点，请进行对比分析

【学术回答】""",
                description="学术研究模板，适合学术场景",
                style=PromptStyle.TECHNICAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.RAG,
                    "complexity": "high",
                    "best_for": "academic_research"
                }
            )
        }

    @staticmethod
    def get_chat_templates() -> Dict[str, PromptTemplate]:
        """获取对话相关模板"""
        return {
            # 友好对话模板
            "chat_friendly": PromptTemplate(
                name="chat_friendly",
                template="""你好！我是一个基于知识库的智能助手，很高兴为你服务！

【参考资料】
{context}

【你的问题】
{question}

让我来帮你解答这个问题。根据我掌握的信息：""",
                description="友好对话模板，适合日常交互",
                style=PromptStyle.FRIENDLY,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CHAT,
                    "complexity": "low",
                    "best_for": "casual_conversation"
                }
            ),

            # 专业咨询模板
            "chat_professional": PromptTemplate(
                name="chat_professional",
                template="""您好，我是专业领域智能助手。我将基于提供的专业资料为您提供准确的分析和建议。

【专业资料】
{context}

【咨询问题】
{question}

【专业分析】""",
                description="专业咨询模板，适合商务和技术咨询",
                style=PromptStyle.FORMAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CHAT,
                    "complexity": "medium",
                    "best_for": "professional_consultation"
                }
            ),

            # 教学模板
            "chat_educational": PromptTemplate(
                name="chat_educational",
                template="""同学你好！让我们一起通过以下资料来学习理解这个问题。

【学习资料】
{context}

【学习问题】
{question}

让我们循序渐进地来分析：

1. 首先，让我们看看资料中的关键信息
2. 然后，我们来理解问题的核心
3. 最后，我为你提供详细的解释

【学习解答】""",
                description="教学模板，适合教育和培训场景",
                style=PromptStyle.EDUCATIONAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CHAT,
                    "complexity": "medium",
                    "best_for": "education_training"
                }
            )
        }

    @staticmethod
    def get_analysis_templates() -> Dict[str, PromptTemplate]:
        """获取分析相关模板"""
        return {
            # 专业分析模板
            "analysis_professional": PromptTemplate(
                name="analysis_professional",
                template="""请基于提供的文档材料，进行专业的分析和解答。

【文档资料】
{context}

【分析问题】
{question}

【分析要求】
1. 进行深入的专业分析
2. 提供结构化的回答
3. 引用具体的文档内容作为支撑
4. 如有必要，指出分析的前提和限制

【专业分析】""",
                description="专业分析模板，适合深度分析",
                style=PromptStyle.TECHNICAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.ANALYSIS,
                    "complexity": "high",
                    "best_for": "professional_analysis"
                }
            ),

            # 比较分析模板
            "analysis_comparison": PromptTemplate(
                name="analysis_comparison",
                template="""请基于提供的多个材料，进行全面的比较分析。

【分析材料】
{context}

【比较问题】
{question}

【比较分析框架】
1. 各个材料的核心观点
2. 相同点和不同点
3. 优劣势对比
4. 适用场景分析
5. 综合评估和建议

【比较分析结果】""",
                description="比较分析模板，适合多材料对比",
                style=PromptStyle.DETAILED,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.ANALYSIS,
                    "complexity": "high",
                    "best_for": "comparative_analysis"
                }
            ),

            # SWOT分析模板
            "analysis_swot": PromptTemplate(
                name="analysis_swot",
                template="""请基于提供的信息，进行SWOT（优势-劣势-机会-威胁）分析。

【分析对象】
{context}

【SWOT分析问题】
{question}

【SWOT分析框架】
**优势 (Strengths):**
- 内部优势和积极因素

**劣势 (Weaknesses):**
- 内部劣势和限制因素

**机会 (Opportunities):**
- 外部机会和发展可能

**威胁 (Threats):**
- 外部威胁和风险因素

【SWOT分析报告】""",
                description="SWOT分析模板，适合战略分析",
                style=PromptStyle.TECHNICAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.ANALYSIS,
                    "complexity": "medium",
                    "best_for": "strategic_analysis"
                }
            )
        }

    @staticmethod
    def get_creation_templates() -> Dict[str, PromptTemplate]:
        """获取创作相关模板"""
        return {
            # 创意写作模板
            "creation_creative": PromptTemplate(
                name="creation_creative",
                template="""基于以下灵感和素材，请进行创意写作。

【创作灵感】
{context}

【创作主题】
{question}

【创作要求】
1. 充分发挥创意和想象力
2. 语言生动有趣，富有感染力
3. 结构清晰，逻辑连贯
4. 体现独特的视角和思考

【创意作品】""",
                description="创意写作模板，适合文学创作",
                style=PromptStyle.CREATIVE,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CREATION,
                    "complexity": "medium",
                    "best_for": "creative_writing"
                }
            ),

            # 商业文案模板
            "creation_marketing": PromptTemplate(
                name="creation_marketing",
                template="""请基于以下产品信息，创作吸引人的营销文案。

【产品信息】
{context}

【营销目标】
{question}

【文案创作要求】
1. 突出产品核心卖点和价值
2. 语言简洁有力，富有吸引力
3. 针对目标受众的需求和痛点
4. 包含明确的行动号召

【营销文案】""",
                description="营销文案模板，适合商业推广",
                style=PromptStyle.CREATIVE,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CREATION,
                    "complexity": "medium",
                    "best_for": "marketing_copy"
                }
            )
        }

    @staticmethod
    def get_simple_templates() -> Dict[str, PromptTemplate]:
        """获取简单问答模板"""
        return {
            # 简单问答模板（无上下文）
            "simple_qa": PromptTemplate(
                name="simple_qa",
                template="""请回答以下问题：

{question}

请提供准确、有用的回答。""",
                description="简单问答模板，适合无上下文的一般问题",
                style=PromptStyle.FRIENDLY,
                required_vars=["question"],
                metadata={
                    "category": PromptCategory.QA,
                    "complexity": "low",
                    "best_for": "general_questions"
                }
            ),

            # 代码解释模板
            "code_explanation": PromptTemplate(
                name="code_explanation",
                template="""请解释以下代码的功能和原理：

【代码内容】
{context}

【具体问题】
{question}

【解释要求】
1. 详细解释代码的逻辑和实现方式
2. 说明关键算法和数据结构
3. 指出可能的优化点
4. 提供使用示例

【代码解释】""",
                description="代码解释模板，适合技术说明",
                style=PromptStyle.TECHNICAL,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.CODE,
                    "complexity": "medium",
                    "best_for": "code_explanation"
                }
            ),

            # 摘要生成模板
            "summarization": PromptTemplate(
                name="summarization",
                template="""请为以下内容生成简洁准确的摘要：

【原文内容】
{context}

【摘要要求】
{question}

【摘要】""",
                description="摘要生成模板，适合内容总结",
                style=PromptStyle.CONCISE,
                required_vars=["context", "question"],
                metadata={
                    "category": PromptCategory.SUMMARIZATION,
                    "complexity": "medium",
                    "best_for": "content_summarization"
                }
            )
        }

    @classmethod
    def get_all_templates(cls) -> Dict[str, PromptTemplate]:
        """获取所有内置模板"""
        all_templates = {}

        # 合并所有类别的模板
        template_methods = [
            cls.get_rag_templates,
            cls.get_chat_templates,
            cls.get_analysis_templates,
            cls.get_creation_templates,
            cls.get_simple_templates
        ]

        for method in template_methods:
            templates = method()
            all_templates.update(templates)

        return all_templates

    @classmethod
    def get_templates_by_category(cls, category: PromptCategory) -> Dict[str, PromptTemplate]:
        """
        根据分类获取模板

        Args:
            category: 提示词分类

        Returns:
            Dict[str, PromptTemplate]: 指定分类的模板字典
        """
        all_templates = cls.get_all_templates()

        return {
            name: template for name, template in all_templates.items()
            if template.metadata and template.metadata.get("category") == category
        }

    @classmethod
    def get_templates_by_style(cls, style: PromptStyle) -> Dict[str, PromptTemplate]:
        """
        根据风格获取模板

        Args:
            style: 提示词风格

        Returns:
            Dict[str, PromptTemplate]: 指定风格的模板字典
        """
        all_templates = cls.get_all_templates()

        return {
            name: template for name, template in all_templates.items()
            if template.style == style
        }